package module

import (
	corev1 "k8s.io/api/core/v1"
)

//@Author: morris

// Job基础配置
type JobBase struct {
	// 名字
	Name string `json:"name"`
	// 标签
	Labels []ListMapItem `json:"labels"`
	// 命名空间
	Namespace string `json:"namespace"`
	// 并行度：同时运行的Pod数量
	Parallelism int32 `json:"parallelism"`
	// 完成次数：需要成功运行的Pod总数
	Completions int32 `json:"completions"`
	// 活跃期限：Job可运行的最长时间(秒)，超时将被终止
	ActiveDeadlineSeconds *int64 `json:"activeDeadlineSeconds,omitempty"`
	// 失败重试次数
	BackoffLimit int32 `json:"backoffLimit"`
	// 完成模式：NonIndexed(默认)或Indexed
	//CompletionMode batchv1.CompletionMode `json:"completionMode"`
}

// 卷定义，与Pod中的Volume保持一致
type Volume struct {
	Name string `json:"name"`
	Type string `json:"type"`
}

// DNS配置，与Pod中的保持一致
type DnsConfig struct {
	Nameservers []string `json:"nameservers"`
}

// 网络配置，与Pod中的保持一致
type NetWorking struct {
	HostNetwork bool          `json:"hostNetwork"`
	HostName    string        `json:"hostName"`
	DnsPolicy   string        `json:"dnsPolicy"`
	DnsConfig   DnsConfig     `json:"dnsConfig"`
	HostAliases []ListMapItem `json:"hostAliases"`
}

// 资源限制，与Pod中的保持一致
type Resources struct {
	// 是否配置容器的配额
	Enable bool `json:"enable"`
	// 内存 Mi
	MemRequest int32 `json:"memRequest"`
	MemLimit   int32 `json:"memLimit"`
	// cpu m
	CpuRequest int32 `json:"cpuRequest"`
	CpuLimit   int32 `json:"cpuLimit"`
}

// 卷挂载，与Pod中的保持一致
type VolumeMount struct {
	// 挂载卷名称
	MountName string `json:"mountName"`
	// 挂载卷->对应的容器内的路径
	//MountPath string `json:"mountPath"`
	MountPath string `json:"mountPath"`
	// 是否只读
	ReadOnly bool `json:"readOnly"`
}

// 探针HTTP配置，与Pod中的保持一致
type ProbeHttpGet struct {
	Scheme      string        `json:"scheme"`
	Host        string        `json:"host"`
	Path        string        `json:"path"`
	Port        int32         `json:"port"`
	HttpHeaders []ListMapItem `json:"httpHeaders"`
}

// 探针命令配置，与Pod中的保持一致
type ProbeCommand struct {
	Command []string `json:"command"`
}

// 探针TCP配置，与Pod中的保持一致
type ProbeTcpSocket struct {
	Host string `json:"host"`
	Port int32  `json:"port"`
}

// 探针时间配置，与Pod中的保持一致
type ProbeTime struct {
	InitialDelaySeconds int32 `json:"initialDelaySeconds"`
	PeriodSeconds       int32 `json:"periodSeconds"`
	TimeoutSeconds      int32 `json:"timeoutSeconds"`
	SuccessThreshold    int32 `json:"successThreshold"`
	FailureThreshold    int32 `json:"failureThreshold"`
}

// 容器探针，与Pod中的保持一致
type ContainerProbe struct {
	Enable    bool           `json:"enable"`
	Type      string         `json:"type"`
	HttpGet   ProbeHttpGet   `json:"httpGet"`
	Exec      ProbeCommand   `json:"exec"`
	TcpSocket ProbeTcpSocket `json:"tcpSocket"`
	ProbeTime ProbeTime      `json:"probeTime"`
}

// 容器端口，与Pod中的保持一致
type ContainerPort struct {
	Name          string `json:"name"`
	ContainerPort int32  `json:"containerPort"`
	HostPort      int32  `json:"hostPort"`
}

// 环境变量，与Pod中的保持一致
type EnvVar struct {
	Name    string `json:"name"`
	RefName string `json:"refName"`
	Value   string `json:"value"`
	Type    string `json:"type"` // configMap | secret | default(k/v形式)
}

// 从资源获取环境变量，与Pod中的保持一致
type EnvVarFromResource struct {
	Name    string `json:"name"`
	RefType string `json:"refType"` // configMap | secret
	Prefix  string `json:"prefix"`
}

// 容器配置，与Pod中的保持一致
type Container struct {
	Name            string               `json:"name"`
	Image           string               `json:"image"`
	ImagePullPolicy string               `json:"imagePullPolicy"`
	Tty             bool                 `json:"tty"`
	Ports           []ContainerPort      `json:"ports"`
	WorkingDir      string               `json:"workingDir"`
	Command         []string             `json:"command"`
	Args            []string             `json:"args"`
	Envs            []EnvVar             `json:"envs"`
	EnvsFrom        []EnvVarFromResource `json:"envsFrom"`
	Privileged      bool                 `json:"privileged"`
	Resources       Resources            `json:"resources"`
	VolumeMounts    []VolumeMount        `json:"volumeMounts"`
	StartupProbe    ContainerProbe       `json:"startupProbe"`
	LivenessProbe   ContainerProbe       `json:"livenessProbe"`
	ReadinessProbe  ContainerProbe       `json:"readinessProbe"`
}

// 节点选择表达式，与Pod中的保持一致
type NodeSelectorTermExpressions struct {
	Key      string                      `json:"key"`
	Operator corev1.NodeSelectorOperator `json:"operator"`
	Value    string                      `json:"value"`
}

// 节点调度配置，与Pod中的保持一致
type NodeScheduling struct {
	Type         string                        `json:"type"` // nodeName nodeSelector nodeAffinity
	NodeName     string                        `json:"nodeName"`
	NodeSelector []ListMapItem                 `json:"nodeSelector"`
	NodeAffinity []NodeSelectorTermExpressions `json:"nodeAffinity"`
}

// Job结构体定义，对应Kubernetes的Job资源
type Job struct {
	// Job基础信息
	JobBase JobBase `json:"jobBase"`
	// 容忍度
	Tolerations []corev1.Toleration `json:"tolerations"`
	// 节点调度
	NodeScheduling NodeScheduling `json:"nodeScheduling"`
	// 卷定义
	Volumes []Volume `json:"volumes"`
	// 网络配置
	NetWorking NetWorking `json:"netWorking"`
	// 初始化容器
	InitContainers []Container `json:"initContainers"`
	// 主容器
	Containers []Container `json:"containers"`
	// Pod模板相关配置
	PodTemplateSpec struct {
		// 重启策略，Job通常使用Never或OnFailure
		RestartPolicy corev1.RestartPolicy `json:"restartPolicy"`
		// 当Job完成后，对Pod的处理策略
		//PodRetentionPolicy batchv1.PodRetentionPolicyType `json:"podRetentionPolicy"`
	} `json:"podTemplateSpec"`
}
